# 数据生成代码仅作为主函数调用一次，以保证后续试验数据的一致性。
# 数据生成时，所有参数从文件中统一读取，不允许使用常数，以避免疏漏，造成生成数据与预想情况不一致。
# 生成的数据存入文件中，不再修改，方便进行模块化组装和测试，这在远程运行代码时同样非常有用。
# 在文件中要进行详细的标注，方便后续程序调用，不要怕浪费存储空间。
# 在定义类的时候，属性与方法尽量分开，避免在初始化的时候执行计算，而是将计算放入方法中，不要贪图方便，要便于理解。
# 上述操作并不会导致重复计算导致和数据错误。实际上，只有初始化会执行这部分计算，赋值时并不会。
# 使用 if __name__ == '__main__': 是防止重复计算的好方法 （import 时不执行，执行则可能会造成数据篡改错误）
import time
import random
import pickle
import numpy as np
from os import cpu_count, getpid
from Resources.DAG import DAG

Task_number = [100, 200, 300, 400, 500]
Edge_multiple = [2, 3, 4, 5]
Instructions_boundary = [0, 1800]  # 这里假设最慢的机器上的计算时间在0-30分钟。
CCR = [0.5, 0.67, 1.0, 1.5, 2]
Instance_number = 10

# Task_number = [100]
# Edge_multiple = [2]
# Instructions_boundary = [0, 100]  # 这里假设最慢的机器上的计算时间在0-30分钟。
# CCR = [0.5]
# Instance_number = 10

if __name__ == '__main__':
    print("代码编辑于2024/10/18\n")

    print('CPU内核数: {}'.format(cpu_count()))
    print('当前母进程: {}'.format(getpid()))
    # 日志记录 | 环境信息
    with open("./output/ExecuteResult/RandomData.txt", "w") as output:
        output.write("CPU Core Count: {}\n".format(cpu_count()))
        output.write("Parent Process: {}\n".format(getpid()))
        output.write("\n")

    # 计时器 | 启动
    start = time.time()

    # 需要存储的数据集
    DagList = []

    counter = 0
    for t_num in Task_number:
        for edge_multi in Edge_multiple:
            for ccr in CCR:
                for in_num in range(Instance_number):
                    graph = DAG(t_num, edge_multi, ccr)
                    graph.instructions_boundary = Instructions_boundary
                    # 调用DAG类的generator函数生成随机数据
                    graph.generator()
                    DagList.append(graph)
                    counter = counter + 1
                    # print(counter)
                    path = './Datasets/TrainBC/' + str(t_num) + '_' + str(edge_multi) + '_' + str(ccr) + '_' + str(in_num)
                    with open(path, 'wb') as dbfile:
                        pickle.dump(graph, dbfile)

                    # 日志记录 | 文件计数 & 文件位置信息
                    print("{0:4d}\t{1}".format(counter, path))
                    with open("./output/ExecuteResult/RandomData.txt", "a") as output:
                        output.write("{0:4d}\t{1}\n".format(counter, path))

    # 计时器 | 结束
    end = time.time()
    print("总共用时{}秒".format((end - start)))

    # 日志记录 | 文件运行时间
    with open("./output/ExecuteResult/RandomData.txt", "a") as output:
        output.write("\nTotal Time: {} seconds\n".format(end-start))